import pandas as pd
import numpy as np


def load_sequence_data(csv_path, seq_len=12):
    """
    加载序列数据并将其转换为适用于时间序列模型的输入格式。

    该函数从CSV文件中读取数据，按用户ID和时间戳排序，然后根据指定的序列长度(seq_len)，
    提取每个用户的特征序列和对应的标签。

    参数:
        csv_path (str): CSV文件路径，文件中应包含'user_id', 'timestamp', 'flow', 'pressure', 'alarm', 'label'等列。
        seq_len (int): 序列长度，默认为12，表示每个样本包含的特征时间步数。

    返回:
        samples (numpy.ndarray): 形状为 (样本数量, seq_len, 特征维度) 的三维数组，包含所有提取的特征序列。
        labels (numpy.ndarray): 形状为 (样本数量,) 的一维数组，包含每个特征序列对应的标签。
    """
    # 使用pandas读取CSV文件，解析'timestamp'列为日期时间格式
    df = pd.read_csv(csv_path, parse_dates=['timestamp'])

    # 按'user_id'和'timestamp'对数据进行排序，确保每个用户的记录按时间顺序排列
    df = df.sort_values(['user_id', 'timestamp'])

    # 获取所有唯一的用户ID
    user_ids = df['user_id'].unique()

    # 初始化用于存储样本和标签的列表
    samples = []
    labels = []

    # 遍历每个用户ID
    for uid in user_ids:
        # 提取当前用户的所有数据
        udata = df[df['user_id'] == uid]

        # 提取特征列（'flow', 'pressure', 'alarm'），并将其转换为二维numpy数组
        feats = udata[['flow', 'pressure', 'alarm']].values

        # 遍历当前用户的特征数据，提取序列样本和标签
        for i in range(len(feats) - seq_len):
            # 提取从第i个时间步开始的长度为seq_len的特征序列
            x = feats[i:i + seq_len]

            # 获取与当前特征序列对应的标签（即第i+seq_len个时间步的'label'值）
            y = udata.iloc[i + seq_len]['label']

            # 将特征序列和标签分别添加到samples和labels列表中
            samples.append(x)
            labels.append(y)

    # 将samples列表转换为numpy数组，并调整形状为 (样本数量, seq_len, 特征维度)
    samples = np.stack(samples)

    # 将labels列表转换为numpy数组
    labels = np.array(labels)

    # 返回特征序列和标签
    return samples, labels